home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_08_10 / 8n10034a < prev    next >
Text File  |  1990-06-08  |  47KB  |  1,710 lines

  1. Listing 3: transact.c
  2.  
  3.  
  4. /*************************
  5. File:    TRANSACT.C
  6. Created
  7. By:        Russell Cook
  8. *************************/
  9.  
  10. #include <stdio.h>
  11. #include <fcntl.h>
  12. #include <string.h>
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <errno.h>
  16.  
  17. #include "environ.h"
  18. #include "transact.h"
  19.  
  20. /*===== MODULE STATIC VARIABLE TYPES =====*/
  21.     /* offset: long file offset where user believes file is positioned        */
  22.     /* fd:        valid file descriptor for CLOSED_FILE (when free)            */
  23.     /* openMode: mode with which file was opened                            */
  24.     /* openPerms: access permissions used for open                            */
  25.     /* index:    handle of associated trans. file (bFileType == USER_FILE)    */
  26.     /* nUseCount: # of associated user files (file type is trans. file)        */
  27.     /* bFileType: USER_FILE or a valid transaction log file type specifier    */
  28.     /* npcFileName:    near pointer to a null-terminated filename                */
  29. typedef struct {
  30.     long offset;
  31.     int fd;
  32.     int openMode;
  33.     int openPerms;
  34.     union {
  35.         FHANDLE index;
  36.         int nUseCount;
  37.     } unionData;
  38.     BOOL bFileType;
  39.     char NEAR *npcFileName;
  40. } TFile;
  41.  
  42. #define FILEOFFSET( npFile )            (npFile)->offset
  43. #define FILEDESCRIPTOR( npFile )        (npFile)->fd
  44. #define FILEMODE( npFile )                (npFile)->openMode
  45. #define FILEPERMS( npFile )                (npFile)->openPerms
  46. #define FILEINDEX( npFile )                (npFile)->unionData.index
  47. #define FILEUSECOUNT( npFile )            (npFile)->unionData.nUseCount
  48. #define FILETYPE( npFile )                (npFile)->bFileType
  49. #define FILENAME( npFile )                (npFile)->npcFileName
  50.  
  51.     /* lOffset:    offset in USER data file where data should be written    */
  52.     /* DataBytes: number of bytes of data extracted from USER file        */
  53.     /* FileMode: read/write accessibility used to open file                */
  54.     /* FilePermissions: access permissions used when USER file opened    */
  55.     /*                    NOTE: NEW_FILE already stripped                    */
  56.     /* sOperation: action which caused transaction logging                */
  57.     /* NameLen: # of bytes (including null) in filename field            */
  58. typedef struct {
  59.     long lOffset;
  60.     unsigned int DataBytes;
  61.     int FileMode;
  62.     int FilePermissions;
  63.     int NameLen;
  64.     short sOperation;
  65. } TRollBackStruct;
  66.  
  67. #define ROLLOFFSET( npRoll )            (npRoll)->lOffset
  68. #define ROLLBYTES( npRoll )                (npRoll)->DataBytes
  69. #define ROLLMODE( npRoll )                (npRoll)->FileMode
  70. #define ROLLPERMS( npRoll )                (npRoll)->FilePermissions
  71. #define ROLLOP( npRoll )                (npRoll)->sOperation
  72. #define ROLLNAMELEN( npRoll )            (npRoll)->NameLen
  73.  
  74. /*===== MODULE STATIC MANIFEST CONSTANTS =====*/
  75. #ifdef MSC51_ENV
  76. #    include <io.h>
  77. #    include <stdlib.h>
  78. #    include <malloc.h>
  79. #    include <dos.h>
  80. #    include <sys/locking.h>
  81. #    include <limits.h>
  82.  
  83. #    define ERROR_CODE    1
  84. #    define SUCCESS_CODE    0
  85. #    define NEW_FILE        (O_CREAT | O_EXCL)
  86. #    define READ_FILE    O_RDONLY
  87. #    define WRITE_FILE    O_WRONLY
  88. #    define BINARY_FILE    O_BINARY
  89. #    define SHARED_FILE    S_IWRITE | S_IREAD
  90. #    define SYNC_FILE    0
  91. #    define _LPN_MAX_    _MAX_DIR
  92. #    define _LFN_MAX_    ( _MAX_FNAME + _MAX_EXT )
  93. #    define MAXUINT        UINT_MAX
  94.  
  95. #    define OPEN(name,mode,perms,pFd) \
  96.         ((*pFd = open(name,mode,perms)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  97. #    define READ(fd,buf,count,pNum)        _dos_read(fd,buf,count,pNum)
  98. #    define WRITE(fd,buf,count,pNum)        _dos_write(fd,buf,count,pNum)
  99. #    define LSEEK(fd,offset,whence,pPos) \
  100.         ((*pPos = lseek(fd,offset,whence)) == -1L ? ERROR_CODE : SUCCESS_CODE)
  101. #    define CLOSE(fd)    (close(fd) == -1 ? ERROR_CODE : SUCCESS_CODE)
  102.  
  103. #    define CHSIZE(fd,lbytes) \
  104.             (chsize(fd,lbytes) == -1 ? ERROR_CODE : SUCCESS_CODE )
  105. #    define UNLINK(npName) \
  106.             (unlink(npName) == -1 ? ERROR_CODE : SUCCESS_CODE )
  107. #    define FSTAT(fd,buf) \
  108.             (fstat(fd,buf) == -1 ? ERROR_CODE : SUCCESS_CODE )
  109.  
  110. #    ifdef MIXED_MODEL
  111. #        define FSTRCPY(lpDest,lpSource)        farStrcpy(lpDest,lpSource)
  112. #        define FSTRLEN(lpString)            farStrlen(lpString)
  113. #    else
  114. #        define FSTRCPY(lpDest,lpSource)        strcpy(lpDest,lpSource)
  115. #        define FSTRLEN(lpString)            strlen(lpString)
  116. #    endif    /* MIXED_MODEL */
  117.  
  118. #    define STRCMP(npStr1,npStr2)        stricmp(npStr1,npStr2)
  119.  
  120. #    define STRDUP( npString )            strdup( npString )
  121. #    define MALLOC( bytes )                malloc( bytes )
  122. #    define REALLOC( ptr, bytes )        realloc( ptr, bytes )
  123. #    define FREE( ptr )                    free( ptr )
  124.  
  125. #    define BYTE_BITS    8
  126. #    define BITS(x)        (BYTE_BITS * sizeof(x))
  127. #endif    /* MS-DOS environment */
  128.  
  129.  
  130. #ifdef TURBOC_ENV
  131. #    include <io.h>
  132. #    include <stdlib.h>
  133. #    include <alloc.h>
  134. #    include <dos.h>
  135. #    include <limits.h>
  136.  
  137. #    define ERROR_CODE    1
  138. #    define SUCCESS_CODE    0
  139. #    define NEW_FILE        (O_CREAT | O_EXCL)
  140. #    define READ_FILE    O_RDONLY
  141. #    define WRITE_FILE    O_WRONLY
  142. #    define BINARY_FILE    O_BINARY
  143. #    define SHARED_FILE    S_IWRITE | S_IREAD
  144. #    define SYNC_FILE    0
  145. #    define _LPN_MAX_    128
  146. #    define _LFN_MAX_    ( 13 )
  147. #    define MAXUINT        UINT_MAX
  148.  
  149. #    define OPEN(name,mode,perms,pFd) \
  150.         ((*pFd = open(name,mode,perms)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  151. #    define READ(fd,buf,count,pNum) \
  152.         ((*pNum = read(fd,buf,count)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  153. #    define WRITE(fd,buf,count,pNum) \
  154.         ((*pNum = write(fd,buf,count)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  155. #    define LSEEK(fd,offset,whence,pPos) \
  156.         ((*pPos = lseek(fd,offset,whence)) == -1L ? ERROR_CODE : SUCCESS_CODE)
  157. #    define CLOSE(fd)    (close(fd) == -1 ? ERROR_CODE : SUCCESS_CODE)
  158.  
  159. #    define CHSIZE(fd,lbytes) \
  160.             (chsize(fd,lbytes) == -1 ? ERROR_CODE : SUCCESS_CODE )
  161. #    define UNLINK(npName) \
  162.             (unlink(npName) == -1 ? ERROR_CODE : SUCCESS_CODE )
  163. #    define FSTAT(fd,buf) \
  164.             (fstat(fd,buf) == -1 ? ERROR_CODE : SUCCESS_CODE )
  165.  
  166. #    define FSTRCPY(lpDest,lpSource)        strcpy(lpDest,lpSource)
  167. #    define FSTRLEN(lpString)            strlen(lpString)
  168. #    define STRCMP(npStr1,npStr2)        stricmp(npStr1,npStr2)
  169.  
  170. #    define STRDUP( npString )            strdup( npString )
  171. #    define MALLOC( bytes )                malloc( bytes )
  172. #    define REALLOC( ptr, bytes )        realloc( ptr, bytes )
  173. #    define FREE( ptr )                    free( ptr )
  174.  
  175. #    define BYTE_BITS    8
  176. #    define BITS(x)        (BYTE_BITS * sizeof(x))
  177. #endif    /* TurboC environment */
  178.  
  179.  
  180. #ifdef SCOUNIX_ENV
  181. #    include <stdlib.h>
  182. #    include <values.h>
  183. #    include <mnttab.h>
  184. #    include <limits.h>
  185.  
  186. #    define ERROR_CODE    1
  187. #    define SUCCESS_CODE    0
  188. #    define NEW_FILE        (O_CREAT | O_EXCL)
  189. #    define READ_FILE    O_RDONLY
  190. #    define WRITE_FILE    O_WRONLY
  191. #    define BINARY_FILE    0
  192. #    define SYNC_FILE    O_SYNC
  193. #    define SHARED_FILE    0666
  194. #    define _LPN_MAX_    LPNMAX
  195. #    define _LFN_MAX_    LFNMAX
  196. #    define MAXUINT        UINT_MAX
  197.     extern int open(char *,int,int);
  198.     extern int    close( int );
  199.     extern long    lseek( int, long, int );
  200.     extern int    read( int, char *, unsigned );
  201.     extern int    write( int, char *, unsigned );
  202.     extern int fstat(int,struct stat *);
  203.     extern int    unlink( char * );
  204.  
  205. #    define OPEN(name,mode,perms,pFd) \
  206.         ((*pFd = open(name,mode,perms)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  207. #    define READ(fd,buf,count,pNum) \
  208.         ((*pNum = read(fd,buf,count)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  209. #    define WRITE(fd,buf,count,pNum) \
  210.         ((*pNum = write(fd,buf,count)) == -1 ? ERROR_CODE : SUCCESS_CODE )
  211. #    define LSEEK(fd,offset,whence,pPos) \
  212.         ((*pPos = lseek(fd,offset,whence)) == -1L ? ERROR_CODE : SUCCESS_CODE)
  213. #    define CLOSE(fd)    (close(fd) == -1 ? ERROR_CODE : SUCCESS_CODE)
  214.  
  215. #    define CHSIZE(fd,lbytes)            ERROR_CODE
  216. #    define UNLINK(npName) \
  217.             (unlink(npName) == -1 ? ERROR_CODE : SUCCESS_CODE )
  218. #    define FSTAT(fd,buf) \
  219.             (fstat(fd,buf) == -1 ? ERROR_CODE : SUCCESS_CODE )
  220.  
  221. #    define FSTRCPY(lpDest,lpSource)        strcpy(lpDest,lpSource)
  222. #    define FSTRLEN(lpString)            strlen(lpString)
  223. #    define STRCMP(npStr1,npStr2)        strcmp(npStr1,npStr2)
  224.  
  225. #    define STRDUP( npString )            strdup( npString )
  226. #    define MALLOC( bytes )                malloc( bytes )
  227. #    define REALLOC( ptr, bytes )        realloc( ptr, bytes )
  228. #    define FREE( ptr )                    free( ptr )
  229. #endif    /* some variation of Unix environment */
  230.  
  231. #ifndef READ
  232. 1 = 0;        /* didn't get an environment specifier */
  233. #endif
  234.  
  235. #define HANDLE_MASK        ((FHANDLE)(1 << (BITS(FHANDLE) - 2) ))
  236.  
  237. #define USER_FILE        ((BOOL)0)
  238. #define CLOSED_FILE        ((int)-1)
  239.  
  240. #define INCR_COUNT        ( 5 )
  241. #define BAD_FTYPE        ((BOOL)(1 << (BITS( BOOL ) - 1)))
  242.  
  243. #define APPEND_OP        ((short) 1)
  244. #define OVERWR_OP        ((short) 2)
  245. #define CHSIZE_OP        ((short) 4)
  246.  
  247. #define DATA_AREA        256
  248. #define XFER_SIZE        (sizeof(TRollBackStruct)